//
// Description: 1997. 访问完所有房间的第一天
// Created by Loading on 2022/6/18.
//

#include <bits/stdc++.h>

using namespace std;

int firstDayBeenInAllRooms(vector<int> &nextVisit) {
    const int MOD = 1e9 + 7;
    int n = nextVisit.size();
    // dp[i] 表示第一次访问 i 房间的天数
    long long dp[n];
    dp[0] = 0;

    for (int i = 1; i < n; ++i) {
        // dp[i] = dp[i - 1] + 第一次访问到第二次访问 i - 1 之间的天数 + 1
        // 第一次访问 i 时，其前面的所有房间都必然访问了偶数次
        // 第一次访问完 i - 1，跳回 nextVisit[i - 1]，需要一天
        // 跳回 nextVisit[i - 1] 时，又变回了奇数次，与第一次访问 nextVisit[i - 1] 时完全一致
        // 由前缀和原理，那么 dp[i - 1] - dp[nextVisit[i - 1] 为从 nextVisit[i - 1] 到 i - 1 需要的天数
        // 由于每次需要取模，所以可能会出现 dp[i - 1] < dp[nextVisit[i - 1] 的情况，需要 + MOD 后再取模
        dp[i] = (dp[i - 1] + 1 + dp[i - 1] - dp[nextVisit[i - 1]] + 1 + MOD) % MOD;
    }

    return (int) dp[n - 1];
}

int main() {
    vector<int> nextVisit{0, 1, 2, 0};

    auto res = firstDayBeenInAllRooms(nextVisit);

    cout << res << endl;

    return 0;
}